#include "B1553_CMDHandle.h"

int B1553_CMDHandle(B1553_BusService *pBusServ, u8 *pRetData, u32 *pRetDataLen)
{
    int ret = 0;
    struct B1553_TmPacket *pTmData = &(pBusServ->Telemeter_TX_Data);
    struct BCST_SAT_time *pSatTime = &(pBusServ->sat_time);

    ret = rt_CMDProc(pBusServ);
    if (ret < 0) // 命令异常或者无命令用，返回
    {
        return CMDHANDLE_ERR;
    }

    if (ret == 0) // 无需处理消息
    {
        return CMDHANDLE_DONE;
    }

    // 发送遥测计数 返回处理完成
    if (pBusServ->Msg_TMTx_cnt > 0)
    {
        if (0xFFFF == pTmData->Comm_Telemeter_TX_Count)
        {
            pTmData->Comm_Telemeter_TX_Count = 0xC000;
        }
        ++pTmData->Comm_Telemeter_TX_Count;
        rt_SendTelemetry(pBusServ);
        pBusServ->Msg_TMTx_cnt--;

        *pRetDataLen = 0;
        pRetData = NULL;

        return (--ret);
    }

    // 数据卷绕处理
    if (pBusServ->Msg_DataWrap_cnt > 0)
    {
        pTmData->Comm_DataWrap_cnt++;
        pBusServ->Msg_DataWrap_cnt--;
        *pRetDataLen = 0;
        pRetData = NULL;

        return (--ret);
    }

    // 接收姿态轨道数据的处理
    if (pBusServ->MsgBcst_PosAlt_cnt > 0)
    {
        // 在轨更新模式不接收姿态轨道数据
        if (pTmData->Work_Mode_Flag == SYS_MODE_UPDATE)
        {
            *pRetDataLen = 0;
            pRetData = NULL;
            --ret;
        }
        else // 其他模式正常接收
        {
            rt_GetPosAltData(pBusServ);
            *pRetDataLen = sizeof(pBusServ->altPos_data);
            pRetData = pBusServ->altPos_data;
            ret = CMDHANDLE_ALTPOS;
        }

        ++pTmData->Comm_Bcst_Count;     // 遥测+1
        pBusServ->MsgBcst_PosAlt_cnt--; // 标志-1

        return ret;
    }

    // 时间处理 修改遥测 发以太网等等
    if (pBusServ->MsgBCST_DataTime_cnt > 0)
    {
        pTmData->SatTime_second_H = pSatTime->second_H;
        pTmData->SatTime_second_L = pSatTime->second_L;

        pBusServ->MsgBCST_DataTime_cnt--;

        *pRetDataLen = sizeof(struct BCST_SAT_time);
        pRetData = (u8 *)&(pBusServ->sat_time);

        return CMDHANDLE_TIME;
    }

    // 接收总线消息处理
    if (pBusServ->Msg_Rx_cnt > 0)
    {
        ret = _RecvBusData_proc(pBusServ);
        if ((ret == CMDHANDLE_BUSCMD) || (ret == CMDHANDLE_DATAINJ))
        {
            *pRetDataLen = (u32)(pBusServ->DistrbTransDesc_bytes); // 长度为DTD长度
            pRetData = (u8 *)&(pBusServ->TC_CmdData);
        }
        else // 消息错误 指针为0
        {
            *pRetDataLen = 0;
            pRetData = NULL;
        }
        pBusServ->Msg_Rx_cnt--;
        return ret;
    }

    return CMDHANDLE_DONE;
}